package com.example.myapplicationktkt2.animation

import android.animation.Animator
import android.animation.AnimatorListenerAdapter
import android.animation.AnimatorSet
import android.animation.ObjectAnimator
import android.animation.ValueAnimator
import android.os.Bundle
import android.view.animation.AnimationUtils
import android.widget.Button
import android.widget.ImageView
import androidx.appcompat.app.AppCompatActivity
import com.example.myapplicationktkt2.R

/**
 * 动画Demo实现概述
 * 我为您创建了一个完整的动画演示应用，包含两种主要的Android动画类型：
 * 1. 补间动画（Tween Animation）
 * 补间动画是Android中较早的动画实现方式，它只改变View的显示效果，不改变View的实际属性。
 * 实现的补间动画类型：
 * 透明度动画（Alpha）：通过alpha_animation.xml实现视图透明度变化
 * 缩放动画（Scale）：通过scale_animation.xml实现视图缩放效果
 * 平移动画（Translate）：通过translate_animation.xml实现视图位置移动
 * 旋转动画（Rotate）：通过rotate_animation.xml实现视图旋转效果
 * 组合动画（Set）：通过set_animation.xml将多种动画效果组合在一起
 * 2. 属性动画（Property Animation）
 * 属性动画是Android 3.0之后引入的更强大的动画系统，它可以直接改变对象的属性值。
 * 实现的属性动画类型：
 * ValueAnimator：通过代码实现数值变化动画，可以自定义动画过程中的值变化
 * ObjectAnimator：直接对对象属性进行动画，如透明度、旋转、缩放等
 * AnimatorSet：组合多个ObjectAnimator，实现复杂的动画效果
 * ViewPropertyAnimator：通过View.animate()方法实现的简化属性动画
 * 3. 技术实现要点
 * 动画资源文件：
 * 所有补间动画都以XML形式定义在res/anim目录下，便于复用和管理。
 * 核心代码实现：
 * AnimationDemoActivity.kt：动画演示的主Activity，包含了所有动画的触发逻辑
 * activity_animation_demo.xml：界面布局文件，包含两组控制按钮和两个动画目标视图
 * 动画特性：
 * 所有动画都设置了重复模式，可以正向和反向播放
 * 提供了重置功能，可以将动画目标恢复到初始状态
 * 使用了ImageView作为动画目标，便于观察动画效果
 * 4. 使用方法
 * 运行应用后，在主界面点击"动画演示"按钮进入动画Demo
 * 在"补间动画"部分，可以点击不同按钮查看各种补间动画效果
 * 在"属性动画"部分，可以查看各种属性动画的实现方式和效果
 * 点击"重置视图"按钮可以将动画目标恢复到初始状态
 */
class AnimationDemoActivity : AppCompatActivity() {

    private lateinit var tweenTargetView: ImageView
    private lateinit var propertyTargetView: ImageView

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_animation_demo)

        initViews()
        setupTweenAnimationButtons()
        setupPropertyAnimationButtons()
    }

    private fun initViews() {
        tweenTargetView = findViewById(R.id.iv_tween_target)
        propertyTargetView = findViewById(R.id.iv_property_target)
    }

    private fun setupTweenAnimationButtons() {
        // 透明度动画按钮
        findViewById<Button>(R.id.btn_alpha_anim).setOnClickListener {
            val alphaAnimation = AnimationUtils.loadAnimation(this, R.anim.alpha_animation)
            tweenTargetView.startAnimation(alphaAnimation)
        }

        // 缩放动画按钮
        findViewById<Button>(R.id.btn_scale_anim).setOnClickListener {
            val scaleAnimation = AnimationUtils.loadAnimation(this, R.anim.scale_animation)
            tweenTargetView.startAnimation(scaleAnimation)
        }

        // 平移动画按钮
        findViewById<Button>(R.id.btn_translate_anim).setOnClickListener {
            val translateAnimation = AnimationUtils.loadAnimation(this, R.anim.translate_animation)
            tweenTargetView.startAnimation(translateAnimation)
        }

        // 旋转动画按钮
        findViewById<Button>(R.id.btn_rotate_anim).setOnClickListener {
            val rotateAnimation = AnimationUtils.loadAnimation(this, R.anim.rotate_animation)
            tweenTargetView.startAnimation(rotateAnimation)
        }

        // 组合动画按钮
        findViewById<Button>(R.id.btn_set_anim).setOnClickListener {
            val setAnimation = AnimationUtils.loadAnimation(this, R.anim.set_animation)
            tweenTargetView.startAnimation(setAnimation)
        }

        // 重置补间动画视图
        findViewById<Button>(R.id.btn_reset_tween).setOnClickListener {
            tweenTargetView.clearAnimation()
            tweenTargetView.alpha = 1.0f
            tweenTargetView.scaleX = 1.0f
            tweenTargetView.scaleY = 1.0f
            tweenTargetView.translationX = 0f
            tweenTargetView.translationY = 0f
            tweenTargetView.rotation = 0f
        }
    }

    private fun setupPropertyAnimationButtons() {
        // ValueAnimator按钮
        findViewById<Button>(R.id.btn_value_anim).setOnClickListener {
            val valueAnimator = ValueAnimator.ofFloat(0f, 360f)
            valueAnimator.duration = 1000
            valueAnimator.repeatCount = 1
            valueAnimator.repeatMode = ValueAnimator.REVERSE
            valueAnimator.addUpdateListener { animator ->
                val value = animator.animatedValue as Float
                propertyTargetView.rotation = value
            }
            valueAnimator.start()
        }

        // ObjectAnimator按钮
        findViewById<Button>(R.id.btn_object_anim).setOnClickListener {
            val objectAnimator = ObjectAnimator.ofFloat(propertyTargetView, "alpha", 1.0f, 0.2f, 1.0f)
            objectAnimator.duration = 1000
            objectAnimator.repeatCount = 1
            objectAnimator.repeatMode = ValueAnimator.REVERSE
            objectAnimator.start()
        }

        // AnimatorSet按钮
        findViewById<Button>(R.id.btn_animator_set).setOnClickListener {
            val scaleX = ObjectAnimator.ofFloat(propertyTargetView, "scaleX", 1.0f, 1.5f, 1.0f)
            val scaleY = ObjectAnimator.ofFloat(propertyTargetView, "scaleY", 1.0f, 1.5f, 1.0f)
            val rotate = ObjectAnimator.ofFloat(propertyTargetView, "rotation", 0f, 360f, 0f)

            val animatorSet = AnimatorSet()
            animatorSet.duration = 1000
            animatorSet.playTogether(scaleX, scaleY, rotate)
            animatorSet.start()
        }

        // ViewPropertyAnimator按钮
        findViewById<Button>(R.id.btn_view_property).setOnClickListener {
            propertyTargetView.animate()
                .translationX(200f)
                .translationY(200f)
                .scaleX(1.5f)
                .scaleY(1.5f)
                .setDuration(1000)
                .setListener(object : AnimatorListenerAdapter() {
                    override fun onAnimationEnd(animation: Animator) {
                        propertyTargetView.animate()
                            .translationX(0f)
                            .translationY(0f)
                            .scaleX(1.0f)
                            .scaleY(1.0f)
                            .setDuration(1000)
                            .start()
                    }
                })
                .start()
        }

        // 重置属性动画视图
        findViewById<Button>(R.id.btn_reset_property).setOnClickListener {
            propertyTargetView.alpha = 1.0f
            propertyTargetView.scaleX = 1.0f
            propertyTargetView.scaleY = 1.0f
            propertyTargetView.translationX = 0f
            propertyTargetView.translationY = 0f
            propertyTargetView.rotation = 0f
        }
    }
}